home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / cross / Avr.lha / Atmel / Asm / src / buff.c < prev    next >
C/C++ Source or Header  |  2000-03-17  |  2KB  |  151 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef unsigned char BYTE;
  5. typedef unsigned long ULONG;
  6.  
  7. #include "buff.h"
  8.  
  9. #define BUFFCHUNK_SIZE  1024
  10.  
  11. int BuffEOF(struct MemBuffer *Buf)
  12. {
  13.   if (Buf->Offset >= Buf->Used)
  14.   {
  15.     return 1;
  16.   }
  17.   return 0;
  18. }
  19.  
  20. int BuffPutS(const char *s, struct MemBuffer *Buf)
  21. {
  22.   while(*s)
  23.   {
  24.     if (BuffPutC(*s, Buf) == 0) return(-1);
  25.     s++;
  26.   }
  27.   return(1);
  28. }
  29.  
  30. BYTE *BuffGetS(char *s, int n, struct MemBuffer *Buf)
  31. {
  32.   char *p=s;
  33.   int k;
  34.  
  35.   do
  36.   {
  37.     k=BuffGetC(Buf);
  38.     if (k == -1) return (NULL);
  39.     *p++=k;
  40.   }while( (--n) && (k!='\n') );
  41.   *p++=0;
  42.   return(s);
  43. }
  44.  
  45. int BuffGetC(struct MemBuffer *Buf)
  46. {
  47.   BYTE Return;
  48.  
  49.   if (Buf->Offset >= Buf->Used)
  50.   {
  51.     return -1;
  52.   }
  53.  
  54.   Return = Buf->Buffer[Buf->Offset];
  55.   Buf->Offset++;
  56.   return (Return);
  57. }
  58.  
  59. int BuffPutC(BYTE Ch, struct MemBuffer *Buf)
  60. {
  61.   if (Buf == NULL)
  62.   {
  63.     return -1;
  64.   }
  65.  
  66.   if (Buf->Buffer == NULL)   /*Allocate some memory for buffer*/
  67.   {
  68.     Buf->Buffer = (BYTE*)malloc(BUFFCHUNK_SIZE);
  69.     if (Buf->Buffer == NULL)
  70.     {
  71.       return -1;
  72.     }
  73.     Buf->Offset = 0;
  74.     Buf->Used = 0;
  75.     Buf->Buff_Size = BUFFCHUNK_SIZE;
  76.   }
  77.  
  78.   Buf->Buffer[Buf->Offset] = Ch;
  79.   Buf->Offset++;
  80.   if (Buf->Offset > Buf->Used)
  81.   {
  82.     Buf->Used = Buf->Offset;
  83.   }
  84.   if (Buf->Offset >= Buf->Buff_Size )
  85.   {
  86.     BYTE *Tmp;
  87.     Tmp = (BYTE*)realloc(Buf->Buffer, Buf->Buff_Size + BUFFCHUNK_SIZE);
  88.     if (Tmp == NULL)
  89.     {
  90.       return -1;
  91.     }
  92.     Buf->Buff_Size += BUFFCHUNK_SIZE;
  93.     Buf->Buffer = Tmp;
  94.   }
  95.   return 1;
  96. }
  97.  
  98. void BuffRewind(struct MemBuffer *Buf)
  99. {
  100.   if (Buf != NULL)
  101.   {
  102.     Buf->Offset = 0;
  103.   }
  104. }
  105.  
  106. void KillBuffer(struct MemBuffer *Buf)
  107. {
  108.   if (Buf->Buffer != NULL)
  109.   {
  110.     free(Buf->Buffer);
  111.     Buf->Buffer = NULL;
  112.   }
  113. }
  114.  
  115. struct MemBuffer *OpenBuffer(void)
  116. {
  117.   struct MemBuffer *Res;
  118.  
  119.   Res = (struct MemBuffer*)malloc(sizeof(struct MemBuffer));
  120.   if (Res != NULL)
  121.   {
  122.     Res->Buffer = NULL;
  123.   }
  124.   return Res;
  125. }
  126.  
  127. void BuffDump(char *Filename, struct MemBuffer *Buf)
  128. {
  129.   FILE *Out;
  130.   int FromBuff;
  131.   ULONG Count;
  132.  
  133.   Out = fopen(Filename,"w");
  134.   if (Out == NULL)
  135.   {
  136.     return;
  137.   }
  138.  
  139.   for(Count=0; Count<Buf->Used; Count++)
  140.   {
  141.     fputc(Buf->Buffer[Count],Out);
  142.   }
  143.   fclose(Out);
  144. }
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.